; ************************************************** ; ; RICEVITORE INFRAROSSO A 4 CANALI SU PIC 12F629 ; (TELECOMANDO CON PROTOCOLLO NEC) ; ; DI MICHELE GUERRA ; ; MG.TEMP@TISCALI.IT - WWW.TATTIK.ALTERVISTA.ORG ; ; REVISIONE FIRMWARE: 13/07/2007 ; REVISIONE HARDWARE: 13/07/2007 ; ; COPYRIGHT (c) 2007 ; ; ************************************************** ; DIRETTIVE PER IL COMPILATORE PROCESSOR 12F629 RADIX DEC INCLUDE "P12F629.INC" __CONFIG 3F8CH ; DEFINIZIONE COSTANTI TEMPOLEARN EQU 20 ; 20*0.5 SEC = 10 SEC DI APPRENDIMENTO ; PER OGNI CANALE ; DEFINIZIONE VARIABILI ORG 20H RIT RES 2 ; X ROUTINE RITARDO 260MSEC INFRARED RES 2 ; RISERVA 2 BYTE PER LA LETTURA INFRAROSSO LEGGIBIT RES 1 ; NR BIT DA LEGGERE DA INFRAROSSO TEMP RES 1 ; VARIABILI TEMPORANEE TEMP_CHECK RES 1 ; TEMP_ADDR RES 1 ; TEMP ADDR X EEPROM TIMER_IR RES 1 ; TIMER MISURAZIONE DATI INFRA DATO_IR RES 1 ; DATO IR RICEVUTO SCRIVI_EE RES 1 ; SCRITTURA SU EEPROM LEGGI_EE RES 8 ; BYTE MEMORIZZATI SU EEPROM ; 2x4 CANALI ; DEFINIZIONE EQU BIT VARI ; PORTE DEL PIC LED EQU 0 ; LED TRIAC1 EQU 1 ; TRIAC 1 TRIAC2 EQU 2 ; TRIAC 2 INFRA EQU 3 ; RICEVITORE INFRAROSSO TRIAC3 EQU 4 ; TRIAC 3 TRIAC4 EQU 5 ; TRIAC 4 ; FLAG SU VARIABILE DATO_IR IR_OK EQU 0 ; DATO INFRAROSSO VALIDO IR_CAN1 EQU 1 ; DATO INFRAROSSO OK E DATO = CANALE 1 IR_CAN2 EQU 2 ; DATO INFRAROSSO OK E DATO = CANALE 2 IR_CAN3 EQU 3 ; DATO INFRAROSSO OK E DATO = CANALE 3 IR_CAN4 EQU 4 ; DATO INFRAROSSO OK E DATO = CANALE 4 ; DEFINIZIONE VETTORI ORG 00H ; VETTORE RESET GOTO INIT ; INIZIALIZZAZIONE DOPO RESET INIT BCF STATUS,RP0 ; BANCO 00 CLRF GPIO ; RESET I/O MOVLW 00000111 ; TUTTI GLI I/O SONO DIGITALI MOVWF CMCON BSF STATUS,RP0 ; BANCO 01 CALL 3FFH ; LEGGE IL VALORE DI CALIBRAZIONE MOVWF OSCCAL ; E LO SCRIVE NEL REGISTRO MOVLW 00001000B ; SET PORTE IN/OUT : GP3=INPUT MOVWF TRISIO MOVLW 10000101B ; PULLUP OFF, PRESCALER A TMR0 1:64 MOVWF OPTION_REG MOVLW 00000000B ; NO INTERRUPT MOVWF INTCON BCF STATUS,RP0 ; BANCO 00 MOVLW 00110001B ; TMR1 ON + PRESCALER 1:8 MOVWF T1CON ; FREQUENZA TIMER1=1MHZ:8 ; = 1 OVERFLOW OGNI ~.524 SEC CLRF GPIO ; RESET I/O ; EVENTUALE APPRENDIMENTO DEI CODICI ; SE SI PREME UN PULSANTE DEL TELECOMANDO MENTRE IL LED E' ACCESO ; (ENTRO TEMPOLEARN SECONDI) VIENE MEMORIZZATO IL CODICE PER IL CANALE 1 ; DOPO IL LAMPEGGIO (CODICE MEMORIZZATO), ALLA RIACCENSIONE DEL LED ; LA PRESSIONE DI UN ALTRO TASTO MEMORIZZA IL CODICE X IL CANALE 2, ; COSI' PER IL CANALE 3 ED IL 4. ; ; SE DOPO L'ACCENSIONE SI ATTENDE LO SPEGNIMENTO DEL LED NON VIENE ; ESEGUITO L'APPRENDIMENTO ED I CODICI VENGONO LETTI DALLA EEPROM INTERNA ; (IL CIRCUITO QUINDI *NON* HA BISOGNO DI APPRENDIMENTO DOPO ESSERE STATO SPENTO ; MA SOLO LA PRIMA VOLTA CHE VIENE UTILIZZATO O QUANDO SI VOGLIONO CAMBIARE I ; CODICI DI ATTIVAZIONE) ; ; PER CAMBIARE L'APPRENDIMENTO DI UN SOLO CANALE E' OBBLIGATORIO INSERIRE I ; PRECEDENTI. PER IL CANALE 3, AD ESEMPIO, OCCORRE RIAPPRENDERE ANCHE I CANALI 1 E 2 ; ; LE USCITE SONO PILOTATE IN MODO BISTABILE: AD OGNI PRESSIONE L'USCITA CAMBIA DI ; STATO: OFF (STATO INIZIALE)->ON->OFF->ON.... ; ; SI POSSONO PILOTARE PIU' CANALI CON LO STESSO TASTO, FACENDO APPRENDERE ; LO STESSO CODICE A CANALI DIVERSI APPRENDI CLRF TEMP_ADDR ; LOCAZIONE 0 PER WRITE DATI IR CANALE 1 APP MOVLW TEMPOLEARN ; CARICA IL TEMPO MAX DI APPRENDIMENTO MOVWF TEMP CLRF TMR1H ; TMR1 OVERFLOW OGNI ~520 MSEC (.5 SEC) CLRF TMR1L BSF GPIO,LED ; * LED ACCESO : APPRENDIMENTO REDO1 CLRWDT CALL LEGGIR ; CONTROLLA SE IR IN ARRIVO BTFSC DATO_IR,IR_OK GOTO MEMO ; SE DATO OK MEMORIZZA BTFSS PIR1,TMR1IF ; SE CONTATORE E' IN OVERFLOW... GOTO REDO1 BCF PIR1,TMR1IF ; ...RESET CONTATORE E... DECFSZ TEMP,1 ; ... DECREMENTA IL TEMPO X APPRENDIMENTO GOTO REDO1 GOTO PRECICLO MEMO MOVF INFRARED+0,W ; SCRIVE SULLA EEPROM I 2 BYTE LETTI DA IR MOVWF SCRIVI_EE CALL SCRIVIEEPROM INCF TEMP_ADDR,1 MOVF INFRARED+1,W MOVWF SCRIVI_EE CALL SCRIVIEEPROM INCF TEMP_ADDR,1 BCF GPIO,LED ; - LAMPEGGIO LED : MEMO OK CALL RIT260 BSF GPIO,LED ; * 1 CALL RIT260 BCF GPIO,LED ; - CALL RIT260 BSF GPIO,LED ; * 2 CALL RIT260 BCF GPIO,LED ; - CALL RIT260 BSF GPIO,LED ; * 3 CALL RIT260 BCF GPIO,LED ; - LED SPENTO X 1 SEC PRIMA DEL NUOVO CALL RIT260 ; APPRENDIMENTO CALL RIT260 CALL RIT260 CALL RIT260 NOPRESS2 CALL LEGGIR ; ATTENDE ASSENZA BTFSC DATO_IR,IR_OK ; DI DATI INFRAROSSI VALIDI GOTO NOPRESS2 MOVLW 8 ; IF LOCAZIONE 8 (2LOCAZIONI*4CANALI) ... SUBWF TEMP_ADDR,W BTFSS STATUS,Z ; ...CICLO NORMALE... GOTO APP ; ...ALTRIMENTI ALTRO APPRENDIMENTO ; CICLO DI FUNZIONAMENTO PRECICLO BCF GPIO,LED ; SPEGNE IL LED ED INIZIA IL CICLO NORMALE ; LEGGE I DATI DALLA EEPROM ; LOCAZIONI 0-7 UNA VOLTA SOLTANTO INVECE CHE AD OGNI RICEZIONE IR ; E LI METTE IN LEGGI_EE BSF STATUS,RP0 ; BANCO 01 CLRF EEADR ; LOCAZIONE INIZIALE = 0 BSF EECON1,RD MOVF EEDATA,W MOVWF LEGGI_EE+0 ; LEGGI_EE=PEEK(EEADR) ;-) INCF EEADR,1 BSF EECON1,RD MOVF EEDATA,W MOVWF LEGGI_EE+1 INCF EEADR,1 BSF EECON1,RD MOVF EEDATA,W MOVWF LEGGI_EE+2 INCF EEADR,1 BSF EECON1,RD MOVF EEDATA,W MOVWF LEGGI_EE+3 INCF EEADR,1 BSF EECON1,RD MOVF EEDATA,W MOVWF LEGGI_EE+4 INCF EEADR,1 BSF EECON1,RD MOVF EEDATA,W MOVWF LEGGI_EE+5 INCF EEADR,1 BSF EECON1,RD MOVF EEDATA,W MOVWF LEGGI_EE+6 INCF EEADR,1 BSF EECON1,RD MOVF EEDATA,W MOVWF LEGGI_EE+7 BCF STATUS,RP0 ; BANCO 00 CICLO CLRWDT ; CICLO ATTESA RILEVAMENTO DATO IR GIA' PRESENTE IN EEPROM CALL LEGGIR ; CONTROLLA SE IR IN ARRIVO BTFSS DATO_IR,IR_OK GOTO CICLO ; SE IL DATO INFRAROSSO CORRISPONDE AD UNO DEI CANALI 1-4 ; AGISCE ACCENDENDO O SPEGNENDO L'USCITA CHECK_1 BTFSS DATO_IR,IR_CAN1 GOTO CHECK_2 USCITA_1 BTFSC GPIO,TRIAC1 GOTO OFF1 BSF GPIO,TRIAC1 GOTO CHECK_2 OFF1 BCF GPIO,TRIAC1 CHECK_2 BTFSS DATO_IR,IR_CAN2 GOTO CHECK_3 USCITA_2 BTFSC GPIO,TRIAC2 GOTO OFF2 BSF GPIO,TRIAC2 GOTO CHECK_3 OFF2 BCF GPIO,TRIAC2 CHECK_3 BTFSS DATO_IR,IR_CAN3 GOTO CHECK_4 USCITA_3 BTFSC GPIO,TRIAC3 GOTO OFF3 BSF GPIO,TRIAC3 GOTO CHECK_4 OFF3 BCF GPIO,TRIAC3 CHECK_4 BTFSS DATO_IR,IR_CAN4 GOTO LAMP USCITA_4 BTFSC GPIO,TRIAC4 GOTO OFF4 BSF GPIO,TRIAC4 GOTO LAMP OFF4 BCF GPIO,TRIAC4 ; SE ALMENO UNO DEI CANALI E' SETTATO ALLORA ALMENO UN'USCITA E' VARIATA ; QUINDI LAMPEGGIA LAMP BTFSC DATO_IR,IR_CAN1 GOTO OKCMD BTFSC DATO_IR,IR_CAN2 GOTO OKCMD BTFSC DATO_IR,IR_CAN3 GOTO OKCMD BTFSS DATO_IR,IR_CAN4 GOTO NOPRESS OKCMD BSF GPIO,LED ; * LAMPEGGIO X CONFERMA ATTUAZIONE CALL RIT260 CALL RIT260 CALL RIT260 BCF GPIO,LED ; - NOPRESS CALL RIT260 ; ATTENDE ASSENZA CALL LEGGIR ; DI DATI INFRAROSSI VALIDI BTFSC DATO_IR,IR_OK GOTO NOPRESS GOTO CICLO ; *************************************************************** ; SUBROUTINE VARIE ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ROUTINE PAUSA ~262915USEC = ~.263 SEC RIT260 CLRF RIT CLRF RIT+1 LOOP_RIT CLRWDT DECFSZ RIT,1 GOTO LOOP_RIT DECFSZ RIT+1,1 GOTO LOOP_RIT RETURN ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SCRITTURA SU EEPROM SCRIVIEEPROM BSF STATUS,RP0 ; BANCO 01 MOVF TEMP_ADDR,W MOVWF EEADR ; INDIRIZZO DI SCRITTURA DALLA VARIABILE ADDR MOVF SCRIVI_EE,W ; SCRIVE SCRIVI_EE SU EEPROM MOVWF EEDATA ; POKE ADDR,SCRIVI_EE ;-) BSF EECON1,WREN MOVLW 85 MOVWF EECON2 MOVLW 170 MOVWF EECON2 BSF EECON1,WR WRITENOK BTFSC EECON1,WR GOTO WRITENOK BCF STATUS,RP0 ; BANCO 00 RETURN ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ROUTINE GESTIONE LETTURA DATO INFRAROSSO LEGGIR CLRF DATO_IR ; AZZERA FLAG IR NOP ; ATTESA X CONTROLLO PERSISTENZA NOP ; STATO DI "START" SU IR BTFSC GPIO,INFRA ; ESCE SUBITO SE NESSUN DATO IR PRESENTE RETURN ; TMR0 AVANZA DI 1 OGNI 64 MICROSECONDI (PRESCALER 1:64) ; TEMPORIZZAZIONI UTILI PER PROTOCOLLO NEC ; DATO DUR CICLI TMR0 LIMITI DI CONTROLLO (+/- ~10-20%) ; ------ ---- ---------- ----------------------------- ; START = 9000 USEC = 140.62500 = 127 < 141 < 155 ; SYNC = 4500 USEC = 70.31250 = 63 < 70 < 77 ; BURST = 560 USEC = 8.75000 = 6 < 9 < 12 ; "0"(*) = 560 USEC = 8.75000 = 6 < 9 < 12 ; "1"(*) = 1690 USEC = 26.40625 = 20 < 26 < 32 ; (*)ESCLUSA LA DURATA DEL "BURST" ; FRAME DATI NEC = START + SYNC + ADDR (x8) + _ADDR (x8) + ; + COMMAND (x8) + _COMMAND (x8) CLRF TMR0 ; CONTATORE BIT "START" REDO_START CLRWDT BTFSS GPIO,INFRA GOTO REDO_START MOVF TMR0,W MOVWF TIMER_IR MOVLW 127 ; CONTROLLA LIMITE INFERIORE SUBWF TIMER_IR,W BTFSS STATUS,C GOTO FINEIR MOVLW 155 ; CONTROLLA LIMITE SUPERIORE SUBWF TIMER_IR,W BTFSC STATUS,C GOTO FINEIR CLRF TMR0 ; CONTATORE BIT "SYNC" REDO_SYNC CLRWDT BTFSC GPIO,INFRA GOTO REDO_SYNC MOVF TMR0,W MOVWF TIMER_IR MOVLW 63 ; CONTROLLA LIMITE INFERIORE SUBWF TIMER_IR,W BTFSS STATUS,C GOTO FINEIR MOVLW 77 ; CONTROLLA LIMITE SUPERIORE SUBWF TIMER_IR,W BTFSC STATUS,C GOTO FINEIR ; INIZIO LA LETTURA DEI BIT, TRALASCIANDO GLI ULTIMI 8 ; CHE CONTENGONO "COMMAND" NEGATO (_COMMAND) CLRF INFRARED ; AZZERA DATO IR CLRF INFRARED+1 MOVLW 24 MOVWF LEGGIBIT ; NR BIT DA LEGGERE (8*3 BYTE) ; CONTROLLA LA PRESENZA DEI 560USEC DI "BURST" ; PRIMA DELLO "0" O "1" LOGICO REDO_BIT CLRF TMR0 ; CONTATORE BIT REDO_BITX CLRWDT BTFSS GPIO,INFRA GOTO REDO_BITX MOVF TMR0,W MOVWF TIMER_IR MOVLW 6 ; CONTROLLA LIMITE INFERIORE SUBWF TIMER_IR,W BTFSS STATUS,C GOTO FINEIR MOVLW 12 ; CONTROLLA LIMITE SUPERIORE SUBWF TIMER_IR,W BTFSC STATUS,C GOTO FINEIR ; OK BURST PRESENTE, ORA VERIFICA SE VIENE TX UN "1" (+1690USEC) ; O SE E' "0" (+560USEC) CLRF TMR0 ; CONTATORE BIT REDO_BITVAL CLRWDT BTFSC GPIO,INFRA GOTO REDO_BITVAL MOVF TMR0,W MOVWF TIMER_IR ; SE DURATA INFERIORE A 560USEC (+/- TOLLERANZA) DATO NON VALIDO MOVLW 6 ; CONTROLLA LIMITE INFERIORE SUBWF TIMER_IR,W BTFSS STATUS,C GOTO FINEIR ; SE DURATA NELL'INTORNO 560USEC ALLORA E' UNO ZERO LOGICO MOVLW 12 ; CONTROLLA LIMITE SUPERIORE SUBWF TIMER_IR,W BTFSS STATUS,C GOTO ZERO_LOGICO ; SE DURATA ATTORNO AI 1690USEC E' UNO 1 LOGICO MOVLW 20 ; CONTROLLA LIMITE INFERIORE SUBWF TIMER_IR,W BTFSS STATUS,C GOTO FINEIR MOVLW 32 ; CONTROLLA LIMITE SUPERIORE SUBWF TIMER_IR,W BTFSC STATUS,C GOTO FINEIR ; E' UN 1 LOGICO BSF STATUS,C GOTO RUOTA ZERO_LOGICO BCF STATUS,C RUOTA RRF INFRARED,1 MOVLW 17 SUBWF LEGGIBIT,W BTFSS STATUS,Z GOTO DECBIT ; DOPO CHE E' STATO LETTO IL BIT 16 IN INFRARED C'E' ; "ADDRESS" COMPLETO, QUINDI LO COPIO X NON PERDERLO ; NOTARE CHE ADDRESS NEGATO (_ADDRESS) VIENE LETTO E ; SOVRASCRITTO SU INFRARED ; ALL'USCITA DELLLA LETTURA SU INFRARED PERMANE INVECE ; IL VALORE DI "COMMAND" MENTRE COMMAND NEGATO (_COMMAND) ; NON VIENE LETTO (ATTESA A VUOTO PRIMA DEL RETURN) MOVF INFRARED,W MOVWF INFRARED+1 CLRF INFRARED DECBIT DECFSZ LEGGIBIT,1 GOTO REDO_BIT ; ORA "ADDRESS" E' IN INFRARED+1 ; E "COMMAND" E' IN INFRARED ; DA QUI IL DATO E' UN INFRAROSSO CON PROTOCOLLO NEC VALIDO OKVALIDO BSF DATO_IR,IR_OK ; ******** ; VERIFICA SE IL DATO INFRAROSSO E' UGUALE A 1 DEI 4 IN EEPROM ; CANALE 1 CLRF TEMP_CHECK ; TEMP CONTROLLA I RISCONTRI POSITIVI (2) MOVF LEGGI_EE+0,W ; SE LEGGI_EE=INFRARED+0 TEMP++ XORWF INFRARED+0,W BTFSC STATUS,Z INCF TEMP_CHECK,1 MOVF LEGGI_EE+1,W ; SE LEGGI_EE=INFRARED+1 TEMP++ XORWF INFRARED+1,W BTFSC STATUS,Z INCF TEMP_CHECK,1 MOVLW 2 ; SE TEMP=2 DATO IR = CANALE 1 SUBWF TEMP_CHECK,W BTFSC STATUS,Z BSF DATO_IR,IR_CAN1 ; CANALE 2 CLRF TEMP_CHECK ; TEMP CONTROLLA I RISCONTRI POSITIVI (2) MOVF LEGGI_EE+2,W ; SE LEGGI_EE=INFRARED+0 TEMP++ XORWF INFRARED+0,W BTFSC STATUS,Z INCF TEMP_CHECK,1 MOVF LEGGI_EE+3,W ; SE LEGGI_EE=INFRARED+1 TEMP++ XORWF INFRARED+1,W BTFSC STATUS,Z INCF TEMP_CHECK,1 MOVLW 2 ; SE TEMP=2 DATO IR = CANALE 1 SUBWF TEMP_CHECK,W BTFSC STATUS,Z BSF DATO_IR,IR_CAN2 ; CANALE 3 CLRF TEMP_CHECK ; TEMP CONTROLLA I RISCONTRI POSITIVI (2) MOVF LEGGI_EE+4,W ; SE LEGGI_EE=INFRARED+0 TEMP++ XORWF INFRARED+0,W BTFSC STATUS,Z INCF TEMP_CHECK,1 MOVF LEGGI_EE+5,W ; SE LEGGI_EE=INFRARED+1 TEMP++ XORWF INFRARED+1,W BTFSC STATUS,Z INCF TEMP_CHECK,1 MOVLW 2 ; SE TEMP=2 DATO IR = CANALE 1 SUBWF TEMP_CHECK,W BTFSC STATUS,Z BSF DATO_IR,IR_CAN3 ; CANALE 4 CLRF TEMP_CHECK ; TEMP CONTROLLA I RISCONTRI POSITIVI (2) MOVF LEGGI_EE+6,W ; SE LEGGI_EE=INFRARED+0 TEMP++ XORWF INFRARED+0,W BTFSC STATUS,Z INCF TEMP_CHECK,1 MOVF LEGGI_EE+7,W ; SE LEGGI_EE=INFRARED+1 TEMP++ XORWF INFRARED+1,W BTFSC STATUS,Z INCF TEMP_CHECK,1 MOVLW 2 ; SE TEMP=2 DATO IR = CANALE 1 SUBWF TEMP_CHECK,W BTFSC STATUS,Z BSF DATO_IR,IR_CAN4 ; IR_OK=1 > DATO INFRAROSSO VALIDO (ANCHE SE NON PRESENTE IN EEPROM) ; IR_CANx=1 > DATO INFRAROSSO = AL CANALE X (1-4) ; (IL DATO_IR E' VALIDO [SE IR_OK=1] ANCHE SE NON E' PRESENTE TRA ; QUELLI MEMORIZZATI. I VALORI DI INFRARED SONO ANCORA MEMORIZZATI ; ED IN FASE DI APPRENDIMENTO VENGONO UTILIZZATI PER ESSERE SCRITTI SU EEPROM) FINEIR CALL RIT260 RETURN ; FINE PROGRAMMA END